/*
 * Copyright (c) 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy
 * of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */

package findreplace;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * A SubstringReplacer that searches for instances of a regular expression.
 *
 * RegexStringReplacer matcher = new RegexStringReplacer("Hello world", " *");
 *  int loop = 0;
 *  while (matcher.next()) {
 *    match = matcher.currentMatch();
 *    matcher.replaceWith("|");
 *  }
 *  matcher.result() => "Hello|world"
 *
 * @author aiuto@google.com (Tony Aiuto)
 */
public class RegexStringReplacer extends AbstractSubstringReplacer {

  public RegexStringReplacer(String text, String regex) {
    super(text);
    this.pattern = Pattern.compile(regex);
    this.matcher = this.pattern.matcher(text);
  }

  /** Find next instance of the regex. */
  @Override
  public boolean next() {
    clearMatch();
    if (! matcher.find()) return false;

    // Advance currentPosition to start of match
    int matchStart = matcher.start();
    skipOver(matchStart - currentPosition);
    matchLength = matcher.end() - matcher.start();
    return true;
  }

  private final Pattern pattern;
  private final Matcher matcher;
}
